関数 - Noise Protocol Framework (9)
Noiseプロトコルではいくつかの関数が実装されています。
DH関数
GENERATE_KEYPAIR()
秘密鍵と公開鍵のキーペアを(ランダムに)生成するための関数です。ここで生成された鍵を一時鍵として使用して、Diffie-Hellmanを行います。標準ではed25519やed448を使うことができますが、それ以外の公開鍵暗号を使うこともできます。
DH(key_pair, public_key)
自身で作成したkey_pairと相手から受け取ったpublic_keyを使って鍵合意を行い、共通鍵となるバイト列を返します。
ここで使用する関数ではGap-DH problemによる解読が発生しないものを使用しないといけない、とのことですが「Gap-DH problem」がよくわかってないので、後ほど調べてみます。
DHLEN
これは関数ではなく、定数です。公開鍵のバイトサイズを表します。セキュリティー的な理由で32バイト以上であることが必要とされています。
(共通鍵)暗号関数
ENCRYPT(k, n, ad, plaintext)
plaintextを暗号化するための関数です。kは32バイトの暗号鍵、nはnonceと呼ばれる8バイトの整数です。
認証付き暗号(AEAD)と呼ばれる方式で暗号化されます。adはそのための"associated data"です。
標準ではAES-GCMまたはChaCha20Poly1305が利用可能です。
平文plaintextを暗号化したバイト列(平文と同じサイズ)に16バイトの認証用データを付加したものを返します。
AEADはRFC5116で定められています。
DECRYPT(k, n, ad, ciphertext)
ciphertextを復号化するための関数です。パラメータk, n adについては暗号化関数ENCRYPTと同様です。
REKEY(k)
キーの再生成を行います。新しい32バイトの共通鍵(k)を生成するための関数です。
デフォルトの実装としては、ENCRYPT(k, maxnonce, zerolen, zeros)を返すとされています。暗号化方式やアプリケーションによってはこのデフォルトの実装とは異なるものが定義されている可能性があります。
ハッシュ関数
HASH(data)
dataをハッシュした結果を返します。結果のサイズはHASHLENバイトになります。
HASHLEN
HASH関数の結果のサイズを表す定数です。32バイトまたは64バイトでなければいけません。
BLOCKLEN
入力された値を分割するために内部的に使用するブロック長です。HMACの計算で使用します。
その他
上記のHASH()関数をベースとして、以下の2つの関数も定義されています。
HMAC-HASH(key, data)
HASH()関数を使ってHMACを計算します。この関数はHKDF関数内でのみ使用されています。
HKDF(chaining_key, input_key_material, num_outputs)
HMACをベースとした鍵導出関数(Key Devrivation Function)です。
chaining_key(後述)はHASHLENと同じサイズのバイト列。
input_key_materialのサイズは0か32かDHLENのいずれか。
num_outputsは(Noiseプロトコルで使用するのは)2か3
HKDFの定義はRFCで定められています。
各要素がHASHLENバイトの配列を返します。配列の長さはnum_outputsです。